iT邦幫忙

2022 iThome 鐵人賽

DAY 9
0
Security

學習密碼學神祕名詞系列 第 9

介紹 SHA-1

  • 分享至 

  • xImage
  •  

SHA-1 全名是 Secure Hash Algorithm 1。是由美國 NIST(國家標準技術研究所) 選出的 密碼雜湊函数 - CHF
MD5 相同,SHA-1 也是 Merkle–Damgård 架構 產生的 CHF,只是由 MD5 的 128-bit 增長到 160-bit。不過如同 MD5,SHA-1 也同樣被王小云教授「破解」了。一般是建議不要再使用,可能也只剩下比對資料的用途

Digest 越長,所需要破解的難度則越高,不過由於 CHF 也需要非常快的速度,所以複雜及時間的取捨需要大量的數學研究。值得我們心存感恩的使用。

範例

我們一樣用 OpenSSL 來做一個極簡易的例子。與 MD5 的介面基本上是一模一樣,所以可以參考 MD5 的文章。

require 'openssl'
OpenSSL::Digest::SHA1.new('abcefg').base64digest
# => "FtjX5Yohb+jpELQoQK84r8xte/w="
OpenSSL::Digest::SHA1.new('abcefi').base64digest
# 明明只差最後一個字元,但產生的 digest 完全不一樣
# => "Bwt90QIPHa8KjeH3gYlTk3FjEFI="

若要計算一個檔案的 SHA1 Digest,比如我電腦中有一碗很好吃的一幸舍拉麵的照片(IMG_2041.jpeg):
https://ithelp.ithome.com.tw/upload/images/20220919/20141437xSgI328mjX.jpg

require 'openssl'
filepath = './IMG_2041.jpeg'

sha1 = OpenSSL::Digest::SHA1.new
# 以 binary, 'b' 的方式開檔案
File.open(filepath, "rb") do |f|
  buf = ""
  # 16384 bits = 2048 bytes = SHA-1 能計算的最大長度
  while f.read(16384, buf)
    # 一直把讀進來的內容丟給 SHA-1
    sha1 << buf
  end
end
# 最後即可得到SHA-1的 digest 囉!
sha1.base64digest
=> "fDnCXhFpsJOegHU5JF/DyFOc/0E="

# 以上繁雜的步驟可由 #file 解決 XD
OpenSSL::Digest::SHA1.file(filepath).base64digest
=> "fDnCXhFpsJOegHU5JF/DyFOc/0E="

參考資料


上一篇
介紹 MD5
下一篇
介紹 SHA-2
系列文
學習密碼學神祕名詞12
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言